Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

console.log go brrr #193

Merged
merged 16 commits into from
Aug 15, 2023
Merged

console.log go brrr #193

merged 16 commits into from
Aug 15, 2023

Conversation

anishnaik
Copy link
Collaborator

@anishnaik anishnaik commented Aug 2, 2023

This PR introduces console.log functionality for medusa. The PR must satisfy the following technical requirements:

Technical Requirements

  • Be close to compatible with foundry's console.log functionality (string formatting is different)
  • Support string formatting
  • Logs must show up in execution traces
  • Adding console.log should lead to no performance hits or excessive memory costs
  • The code must not take a hit on composability

Design
The console contract is now a CheatCodeContract, aka a precompiled contract. Calling console.log(x) will invoke the associated ABI method in the precompile. The method itself actually does nothing! The reason why we can do this is because our execution tracer will be able to track that the console.log precompile was called and it has access to the input arguments provided to the function. The input arguments is really all we need to handle the rest of the functionality needed by this PR.

During the creation of an execution trace, medusa will specifically search for calls to console.log and will then attempt to parse the various inputs. The main thing that needs to happen with inputs is (a) string formatting or (b) encoding the ABI values into a string. Option (b) is trivial and was already supported. medusa will gather all the logs found in an execution trace and append it to the bottom of the trace under [Logs].

String formatting
The console.log PR also supports string formatting. Note the string formatting is effectively fmt.Sprintf(formattedString, args). Since we use golang's default string formatter, we do not fully support foundry's console.log string formatting. Identifiers such as %o or %i do not work in golang. Thus, the associated documentation for our PR should highlight these differences.

@anishnaik anishnaik requested a review from Xenomega as a code owner August 2, 2023 16:29
@anishnaik anishnaik merged commit 7d2e16c into master Aug 15, 2023
@anishnaik anishnaik deleted the dev/console-log branch August 15, 2023 19:54
damilolaedwards pushed a commit that referenced this pull request Nov 16, 2023
Introduce `console.log` functionality with string formatting capabilities.

---------

Co-authored-by: David Pokora <[email protected]>
s4nsec pushed a commit that referenced this pull request Jul 9, 2024
Introduce `console.log` functionality with string formatting capabilities.

---------

Co-authored-by: David Pokora <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants